﻿#include <iostream>
#include <string>
using namespace std;
/* 对象行为型模式
1.意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
2.别名
状态对象（Objects for States）
3.适用性
在下面的两种情况下均可使用State模式：
a.一个对象的行为取决于它的状态，并且它必须在运行时刻根据状态改变它的行为。
b.一个操作中含有庞大的多分支的条件语句，且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。
*/
	class Context;
	class AbstractState
	{
	public:
		virtual void Handle(Context* pcon) = 0;
	};
	class ConcreteStateNone:public AbstractState
	{
	public:
		void Handle(Context* pcon)
		{
			cout << "没有" << endl;
		}
	};

	class ConcreteStateExist:public AbstractState
	{
	public:
		void Handle(Context* pcon)
		{
			cout << "有了" << endl;
		}
	};
	class Context
	{
	public:
		Context(AbstractState* pstate)
		{
			this->pstate = pstate;
		}
		void Request()
		{
			if(pstate)
			{
				pstate->Handle(this);
			}			
		}
		void ChangeState(AbstractState* pstate)
		{
			this->pstate = pstate;
		}
	private:
		AbstractState* pstate;
	};
	/*
	int main()
	{
		ConcreteStateExist* pexist = new ConcreteStateExist;
		ConcreteStateNone* pnone = new ConcreteStateNone;
		//pstate = pexist;
		Context* pcon = new Context(pexist);
		pcon->Request();
		pcon->ChangeState(pnone);
		pcon->Request();

		return 0;
	}
	*/